package ch07
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	
	import utils.Ball;

	/**
	 * 拖拽影片2
	 * @author sjp
	 *
	 */
	public class MouseMoveDrag2 extends Sprite
	{
		private var ball:Ball;

		public function MouseMoveDrag2()
		{
			init();
		}

		private function init():void
		{
			ball=new Ball();
			ball.x=100;
			ball.y=100;
			addChild(ball);
			/**
			 * 这里有一个技巧，我们要为移动的影片设置 mouseDown 侦听器，而对其它两个事件则在 stage 中进行侦听。
			 * 因为，有时可能拖拽的速度比 Flash 刷新影片位置的速度要快。
			 * 这样一来，如果用影片侦听 mouseUp 和 mouseMove 事件，将有可能不会响应，下一时刻也许鼠标指针就已经不在影片上了。请记住，无论鼠标在哪儿， stage 都将把这些事件发送出去。
			 */
			ball.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
		}

		private function onMouseDown(event:MouseEvent):void
		{
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			/**
			   startDrag () 方法
			   public function startDrag(lockCenter:Boolean = false, bounds:Rectangle = null):void
			   允许用户拖动指定的 Sprite。Sprite 将一直保持可拖动，直到通过调用 Sprite.stopDrag() 方法来明确停止，或直到将另一个 Sprite 变为可拖动为止。
			   在同一时间只有一个 Sprite 是可拖动的。
			   三维显示对象将跟随鼠标，并且 Sprite.startDrag() 将在由显示对象定义的三维平面中移动对象。
			   或者，如果显示对象为二维对象和三维对象的子对象，则二维对象将在由三维父对象定义的三维平面中移动。

			   参数
			   lockCenter:Boolean (default = false) — 指定是将可拖动的 Sprite 锁定到鼠标位置中央 (true)，还是锁定到用户首次单击该 Sprite 时所在的点上 (false)。
			   bounds:Rectangle (default = null) — 相对于 Sprite 父级的坐标的值，用于指定 Sprite 约束矩形。
			 */
			ball.startDrag(true,new Rectangle(100, 100, 300, 300));
		}

		private function onMouseUp(event:MouseEvent):void
		{
			stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			ball.stopDrag();
		}
	}
}